package com.pfzy.rxbus2demo

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import com.blankj.rxbus.RxBus
import java.lang.NullPointerException

class RxBusActivity : AppCompatActivity() {

    private var tvSticky: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        tvSticky = findViewById(R.id.tv_sticky)

        // 注册 String 类型事件
        RxBus.getDefault().subscribe(this, object : RxBus.Callback<String>() {
            override fun onEvent(s: String) {
                tvSticky?.text = Config.appendMsg("without $s")
                throw NullPointerException("")
            }
        })

        // 注册带 tag 为 "my tag" 的 String 类型事件
        RxBus.getDefault().subscribe(this, "my tag", object : RxBus.Callback<String>() {
            override fun onEvent(s: String) {
                tvSticky?.text = Config.appendMsg("with $s")
            }
        })

        // 注册 TestCallback 类型事件
        RxBus.getDefault().subscribe(this, object : RxBus.Callback<TestCallback>() {
            override fun onEvent(testCallback: TestCallback) {
                tvSticky?.text = testCallback.call()?.let { Config.appendMsg(it) }
            }
        })
    }

    override fun onDestroy() {
        super.onDestroy()
        // 注销
        RxBus.getDefault().unregister(this)
    }

    /**
     * 发送没有标签
     */
    fun postWithoutTag(view: View?) {
        Config.restoreMsg()
        RxBus.getDefault().post("tag")
    }

    /**
     * 发送有标签
     */
    fun postWithTag(view: View?) {
        Config.restoreMsg()
        RxBus.getDefault().post("tag", "my tag")
    }

    /**
     * 跳转到StickyTestActivity 没有 标签
     */
    fun postStickyWithoutTag(view: View?) {
        Config.restoreMsg()
        // 粘性事件（也就是先发送事件，在之后注册的时候便会收到之前发送的事件）
        RxBus.getDefault().postSticky("tag")
        // 在需要移除粘性事件的地方移除它
//        RxBus.getDefault().removeSticky("without tag");
        StickyTestActivity.start(this)
    }

    /**
     * 跳转到StickyTestActivity 有 标签
     */
    fun postStickyWithTag(view: View?) {
        Config.restoreMsg()
        RxBus.getDefault().postSticky("tag", "my tag")
        StickyTestActivity.start(this)
    }

    /**
     * 跳转到RxBusManagerActivity
     */
    fun useManager(view: View?) {
        RxBusManagerActivity.start(this)
        finish()
    }

    /**
     * 测试接口
     */
    fun testInterface(view: View?) {
        Config.restoreMsg()
        for (i in 0..99) {
            RxBus.getDefault().post(object : TestCallback {
                override fun call(): String {
                    return i.toString()
                }
            })
        }
    }

    companion object {
        fun start(context: Context) {
            val starter = Intent(context, RxBusActivity::class.java)
            context.startActivity(starter)
        }
    }
}